package commons.base.httpserver;

import org.eclipse.jetty.servlet.ServletHolder;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import commons.base.http.JettyHttpServer;


/**
 * spring mvc服务器,使用嵌入式jetty.
 * 
 * @author yuan<cihang.yuan@happyelements.com>
 *
 */
public class SpringWebServer {

	/**
	 * 创建game http服务器
	 * @return
	 */
//	public static SpringWebServer newGameServer(){
//		HttpServerConfig config = ConfigManager.get(HttpServerConfig.class);
//		
//		JettyHttpServer jettyHttpServer = new JettyHttpServer(config.getMinThreadPoolSize(), config.getMaxThreadPoolSize(), config.getServerIp(), config.getGameHttpPort());
//		jettyHttpServer.setDebug(config.isDebug());
//		
//		return new SpringWebServer(jettyHttpServer);
//	}
//	
//	/**
//	 * 创建battle http服务器
//	 * @return
//	 */
//	public static SpringWebServer newBattleServer(){
//		HttpServerConfig config = ConfigManager.get(HttpServerConfig.class);
//		
//		JettyHttpServer jettyHttpServer = new JettyHttpServer(config.getMinThreadPoolSize(), config.getMaxThreadPoolSize(), config.getServerIp(), config.getBattleHttpPort());
//		jettyHttpServer.setDebug(config.isDebug());
//		
//		return new SpringWebServer(jettyHttpServer);
//	}
	
	private JettyHttpServer server;
	
	private SpringWebServer(JettyHttpServer server){
		this.server = server;
	}
	
	/**
	 * spring mvc 有两个ApplicationContext, 一个用来管理Controller等mvc组件，另一个管理普通组件
	 * 该方法设置一个外部ApplicationContext作为spring mvc本身ApplicationContext 的parent,
	 * 这样Controller等mvc组件可以访问普通bean, 但是普通bean不能访问Controller等mvc组件
	 * @param webApplicationContext
	 */
	public void setRootWebApplicationContext(WebApplicationContext webApplicationContext){
		server.setClassLoader(webApplicationContext.getClassLoader());
		server.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webApplicationContext);
	}
	
	/**
	 * 扫描Controller组件
	 * @param basePackages
	 */
	public void scanController(String...basePackages){
		// 构建管理mvc组件的ApplicationContext
		AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
		ctx.setServletContext(server.getServletContext());
		ctx.scan("com.happyelements.cancer.httpserver");
		if((basePackages != null) && (basePackages.length > 0)){
			ctx.scan(basePackages);
		}
		ctx.refresh();
		
		server.addServlet(new ServletHolder(new DispatcherServlet(ctx)), "/*");
	}
	
	public void start() throws Exception{
    	server.start();
	}
	
	public void close(){
		if(server != null){
			server.stop();
		}
	}
	
}
